package com.heima.user.service.impl;

import com.heima.model.common.constants.user.UserRelationConstants;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.common.exception.CustException;
import com.heima.model.threadLocal.AppThreadLocalUtils;
import com.heima.model.user.dtos.UserRelationDTO;
import com.heima.model.user.pojos.ApUser;
import com.heima.user.service.ApUserRelationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Service;

@Service
public class ApUserRelationServiceImpl implements ApUserRelationService {
    // StringRedisTemplate 比 RedisTemplate 使用起来简单 不需要对key和value 进行序列化 可视化强
    @Autowired
    private StringRedisTemplate redisTemplate;

    @Override
    public ResponseResult follow(UserRelationDTO dto) {
        // 1 检查参数 （是否登录  operation： 0 1  自己不能关注自己   是否已经关注）
        ApUser loginUser = AppThreadLocalUtils.getUser();
        if (loginUser == null) {
            // 说明没有登陆
            CustException.cust(AppHttpCodeEnum.NEED_LOGIN);
        }
        int operation = dto.getOperation().intValue();
        if (operation != 0 && operation != 1) {
            // 既不为0 又不为1 说明状态出错
            CustException.cust(AppHttpCodeEnum.PARAM_INVALID, "关注类型状态有误！");
        }
        // 2 operation = 0 关注  关注集合  粉丝集合  添加数据
        ZSetOperations<String, String> zsetOption = redisTemplate.opsForZSet();
        if (operation == 0) {
            // 判断当前登陆用户 与 作者对应的userid是否一致 一致就是自己关注自己 不允许
            if (loginUser.getId().equals(dto.getAuthorApUserId())) {
                CustException.cust(AppHttpCodeEnum.DATA_NOT_ALLOW, "自己不能关注自己");
            }
            // zscore  集合  元素  有返回值：有这个元素   返回值为null  没有这个元素
            // UserRelationConstants.FOLLOW_LIST + loginUser.getId() 是登陆用户的关注集合
            Double score = zsetOption.score(UserRelationConstants.FOLLOW_LIST + loginUser.getId(), String.valueOf(dto.getAuthorApUserId()));
            if(score != null){
                // 说明已经关注了 不能重复关注
                CustException.cust(AppHttpCodeEnum.DATA_NOT_ALLOW,"不能重复关注同一个人！");
            }
            // 第三个参数 score 与排序有关
            // 关注的集合
            zsetOption.add(UserRelationConstants.FOLLOW_LIST + loginUser.getId(),String.valueOf(dto.getAuthorApUserId()),System.currentTimeMillis());
            // 粉丝的集合
            zsetOption.add(UserRelationConstants.FANS_LIST + dto.getAuthorApUserId(),String.valueOf(loginUser.getId()),System.currentTimeMillis());
        } else {
            // 3 operation = 1 取关  关注集合  粉丝集合  删除数据
            zsetOption.remove(UserRelationConstants.FOLLOW_LIST + loginUser.getId(),String.valueOf(dto.getAuthorApUserId()));
            zsetOption.remove(UserRelationConstants.FOLLOW_LIST + dto.getAuthorApUserId(),String.valueOf(loginUser.getId()));
        }
        return ResponseResult.okResult();
    }
}